package com.multi01;

/**
[一个线程在进入对象的休息室(调用该对象的wait()方法)后会释放对该对象的锁]，基于这个原因。在同步中，除非必要，否则你不应用使用Thread.sleep(long l)方法，因为sleep方法并不释放对象的锁。
这是一个极其恶劣的品德，你自己什么事也不干，进入sleep状态，却抓住竞争对象的监视锁不让其它需要该对象监视锁的线程运行，简单说是极端自私的一种行为。但我看到过很多程序员仍然有在同步方法中调用sleep的代码。

 */
class SleepTest {

    public synchronized void wantSleep() {
        try {
            // Thread.sleep(1000 * 10);
            this.wait(1000 * 10);
        } catch (Exception e) {
        }
        System.out.println("111");
    }

    public synchronized void say() {
        System.out.println("123");
    }
}

class T1 extends Thread {
    SleepTest st;

    public T1(SleepTest st) {
        this.st = st;
    }

    public void run() {
        st.wantSleep();
    }
}

class T2 extends Thread {
    SleepTest st;

    public T2(SleepTest st) {
        this.st = st;
    }

    public void run() {
        st.say();
    }
}


public class ThreadSleep {
    public static void main(String[] args) throws Exception {
        SleepTest st = new SleepTest();
        new T1(st).start();
        new T2(st).start();
    }
}